package com.cskaoyan.rocketmq.delay;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.io.UnsupportedEncodingException;

/**
 * 创建日期: 2023/01/12 16:14
 *
 * @author ciggar
 */
public class DelayProducer {

    // 延迟消息的发送者

    public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {

        // 1. 构建消息生产者
        DefaultMQProducer producer = new DefaultMQProducer("delay_group");

        // 2. 注册中心注册
        producer.setNamesrvAddr("localhost:9876");

        // 3. 启动
        producer.start();

        // 4. 构建消息对象
        Message message = new Message("delay_topic", "hello,delay message".getBytes("utf-8"));

        // 5. 指定消息的延迟级别
        // 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
        // 1  2  3   4   5  6  7  8  9  10 11 12 13 14  15  16  17 18
        message.setDelayTimeLevel(2);

        // 思考题：
        // RocketMQ 如何发送一个 自定义时间的延迟消息呢？

        // 把具体想要延迟的时间做一个分解，采用消息接力的方式，来实现自定义时间的延迟消息
        // 比如： 要发送一个 延迟 2:35:18s 的延迟消息
        // 1. 先发送一个延迟两小时的消息
        // 2. 收到这个消息之后，再发送一个延迟30分钟的消息
        // 3. 收到这个消息之后，再发送一个延迟5分钟的消息
        // 4. 收到这个消息之后，再发送一个延迟30分钟的消息
        // 5. 收到这个消息之后，再发送一个延迟10s的消息
        // 6. 收到这个消息之后，再发送一个延迟5s的消息
        // 7. 收到这个消息之后，再发送一个延迟1s的消息
        // 8. 收到这个消息之后，再发送一个延迟1s的消息
        // 9. 收到这个消息之后，再发送一个延迟1s的消息


        // 6. 发送消息
        SendResult sendResult = producer.send(message);

        long sendTime = System.currentTimeMillis();
        System.out.println("发送时间：" + sendTime);

        System.out.println("sendRet:" + sendResult);


    }
}
